package done.easy_201_300;

import com.study.common.ListNode;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;

import static com.study.util.LogUtil.info;

/**
 * 206. Reverse Linked List 单链表反转
 * <p>
 * 示例:
 * 输入: 1->2->3->4->5->NULL
 * 输出: 5->4->3->2->1->NULL
 * <p>
 * 2019-03-24 9:08 PM
 **/
@Slf4j
public class ReverseLinkedList {

    @SuppressWarnings("all")
    public ListNode reverseList(ListNode head) {
        // 190324 first
        // 190326 second
        // 190328 third 2次
        // 190331 fourth
        // 190408 fifth 2次
        // 190409 sixth
        // 190412 seventh 出了一点小问题，但是自己解决了
        // 190416 非递归方法 做了两次，递归方法居然又忘了，至少说明没牢固掌握
        // 190417 非递归能自己做出来 但是不是真的会，而是背下来了
        // 190506 递归卡了一次，没看答案出来了。
        // 190510 递归一遍过, 非递归不会
        // 190528 递归一次过, 非递归一次过
        // 190529 非递归没做出来，不是真会，递归做错了边界值判断，并没有一遍过
        // 190530 递归、非递归都是一遍过
        // 190531 递归、非递归都是一遍过
        // 190601 递归、非递归都是一遍过
        // 190605 递归没问题，非递归没做出来 忘了到底在遍历谁？？？ 奇怪的记忆力，其实你还是不知道在遍历谁
        // 190606 递归、非递归都是一遍过
        // 190617 递归一遍过，非递归卡了一下不看答案也过了
        // 190829 递归卡住了，看了答案，非递归没思路。
        // 190830 递归过了，非递归没思路, 看着答案做了一遍
        return null;
    }

    @Test
    public void test() {
        ListNode head = new ListNode(1, 2, 3, 4, 5, 6);
        info(head);
        info(reverseList(head));
    }
}























/*
// 递归方法
public ListNode reverseList(ListNode head) {
    if (head == null || head.next == null){
        return head;
    }
    ListNode newHead = reverseList(head.next);
    head.next.next = head;
    head.next = null;
    return newHead;
}
*/

/*
// 非递归方法
// 在头结点node遍历的时候此时为1结点 next = 1结点.next(2结点)
// 准备两个空结点 pre用来保存先前结点、next用来做临时变量
// 1结点.next=pre(null) pre = 1结点 node = 2结点
// 进行下一次循环node=2结点 next = 2结点.next(3结点) 2结点.
// next=pre(1结点)=>即完成2->1 pre = 2结点 node = 3结点
// 进行循环...
public ListNode reverseList(ListNode head) {
    ListNode pre = null;
    ListNode next = null;
    while (head != null) {
        next = head.next;
        head.next = pre;
        pre = head;
        head = next;
    }
    return pre;
}
*/
